#ifndef SEM_DEAL_H_
#define SEM_DEAL_H_

/*头文件包含*/
#include <semaphore.h>				//< 信号量头文件
#include <fcntl.h>					//< 信号量头文件


///*信号量处理函数宏定义*/
///*
//	sem_init() 初始化一个定位在 sem 的匿名信号量。
//	value 参数指定信号量的初始值。 
//	pshared 参数指明信号量是由进程内线程共享，还是由进程之间共享。
//	如果 pshared 的值为 0，那么信号量将被进程内的线程共享，并且应该放置在这个进程的所有线程都可见的地址上(如全局变量，或者堆上动态分配的变量)。
//	信号量为0时为阻塞状态，大于0时为非阻塞状态。
//	此时每释放一次信号量，信号量的值会减1。
//S_IRUSR | S_IWUSR*/
//#define MUTEX_INIT(MUTEX_VARIABLE, WRONG_MSG) {\
//if (pthread_mutex_init(&MUTEX_VARIABLE, NULL) != 0)\
//{\
//	perror(WRONG_MSG);\
//	return false;\
//}\
//}
//
////< 信号量释放宏定义
//#define MUTEX_UNLOCK(MUTEX_VARIABLE, WRONG_MSG) {\
//if (pthread_mutex_unlock(&MUTEX_VARIABLE) != 0)\
//{\
//	perror(WRONG_MSG);\
//}\
//}
//
////< 信号量等待宏定义（加入if(errno == EINTR)判断忽略interrupted system call警告）
//#define MUTEX_LOCK(MUTEX_VARIABLE, WRONG_MSG) {\
//if (pthread_mutex_lock(&MUTEX_VARIABLE) != 0)\
//{\
//	if(errno == EINTR)\
//		continue;\
//	else{\
//	perror(WRONG_MSG);\
//	continue;\
//	}\
//}\
//}

//< duan20200205修改
/*信号量处理函数宏定义*/
/*
	信号量初始化宏定义（选择信号量创建方式为O_CREAT，即创建一信号量，
	若其不存在则创建它，其权限量为可读并可写，网上另一说法可采取0644也可，
	信号量初始化为0),信号量为0时为阻塞状态，大于0时为非阻塞状态，
	此时每释放一次信号量，信号量的值会减1。
*/
#define SEM_OPEN(SEM_VARIABLE, SEM_NAME, WRONG_MSG, SEM_VALUE) {\
if ((SEM_VARIABLE = sem_open(SEM_NAME, O_CREAT, S_IRUSR | S_IWUSR, SEM_VALUE)) == SEM_FAILED)\
{\
	perror(WRONG_MSG);\
	return false;\
}\
}

//< 信号量释放宏定义
#define SEM_POST(SEM_VARIABLE, WRONG_MSG) {\
if (sem_post(SEM_VARIABLE) == -1)\
{\
	perror(WRONG_MSG);\
}\
}

//< 信号量等待宏定义（加入if(errno == EINTR)判断忽略interrupted system call警告）
#define SEM_WAIT(SEM_VARIABLE, WRONG_MSG) {\
if (sem_wait(SEM_VARIABLE) == -1)\
{\
	if(errno == EINTR)\
		continue;\
	else{\
	perror(WRONG_MSG);\
	continue;\
	}\
}\
}

#endif
